package it.azienda.managerworkstandard.view;

import it.azienda.framework.persistenza.DAOConnectionSingleton;
import it.azienda.framework.persistenza.DAOException;
import it.azienda.framework.utilita.Utilita;
import it.azienda.framework.view.Dettaglio;
import it.azienda.managerworkstandard.modello.BeanDareAvere;
import it.azienda.managerworkstandard.modello.BeanFattura;
import it.azienda.managerworkstandard.modello.BeanFatturaAcquistoDett;
import it.azienda.managerworkstandard.modello.BeanLogin;
import java.util.ArrayList;
import java.sql.Date;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlForm;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.hibernate.Session;

public class DettaglioDareAvere extends Dettaglio{
    
    public DettaglioDareAvere() {  }
    
    private HtmlForm form = new HtmlForm();
    private BeanDareAvere beanDareAvere = new BeanDareAvere();
    
    public void setBeanDareAvere(BeanDareAvere beanDareAvere) {
        setObj(beanDareAvere);
        this.beanDareAvere = beanDareAvere;
    }
    
    public BeanDareAvere getBeanDareAvere(){
        return (BeanDareAvere)getObj();
    }
    
    public HtmlForm getForm() {
        form = (HtmlForm) Utilita.getSession().getAttribute("form");
        if (form == null) {
            form = new HtmlForm();
        }
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanDareAvere =(BeanDareAvere) ctx.getExternalContext().getRequestMap().get("beanDareAvere");
        Utilita.getSession().removeAttribute("form");
        return form;
    }
    
    public void setForm(HtmlForm form) {
        setFormObject(form);
        this.form = form;
        Utilita.getSession().setAttribute("form",form);
    }
    
    public void entra(ActionEvent ae) {
        pulisci();
        beanDareAvere = new BeanDareAvere();
        beanDareAvere.setDescrizione("Differenza tra il totale in Dare e il totale in Avere: ");
        try{
            calcolaDareAvere();
            beanDareAvere.setImporto(arrotonda(new Double(beanDareAvere.getTotaleDare().doubleValue() - beanDareAvere.getTotaleAvere().doubleValue()),2));
            Utilita.getRequest().setAttribute("beanDareAvere",beanDareAvere);
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Errore"+e);
        }finally{
            DAOConnectionSingleton.closeSession();
        }
        String url2 = "/dettaglioDareAvere.jsf";
        FacesContext ctx = FacesContext.getCurrentInstance();
        UIViewRoot view = ctx.getApplication().getViewHandler().createView(ctx,url2);
        view.setViewId(url2);
        ctx.setViewRoot(view);
        ctx.renderResponse();
    }
    
    public void calcolaDareAvere() throws DAOException {
        BeanLogin login = (BeanLogin) Utilita.getSession().getAttribute("login");
        Date dataDa = java.sql.Date.valueOf(login.getAnnoGestione().toString()+"-01-01");
        Date dataA = java.sql.Date.valueOf(login.getAnnoGestione().toString()+"-12-31");
        
        //Movimenti in Dare
        String queryDare="select beanFatturaAcquistoDett from  BeanFatturaAcquisto beanFatturaAcquisto," +
                " BeanFatturaAcquistoDett  beanFatturaAcquistoDett" +
                " where beanFatturaAcquistoDett.scadenza between :dataDa and :dataA" +
                " and beanFatturaAcquisto.id = beanFatturaAcquistoDett.beanFatturaAcquisto.id" +
                " order by beanFatturaAcquistoDett.scadenza";
        
        Session session = session = DAOConnectionSingleton.newSession();
        ArrayList lista=(ArrayList)session.createQuery(queryDare).setDate("dataDa",dataDa).setDate("dataA",dataA).list();
        
        ArrayList listaMovDare = new ArrayList();
        
        for(int i=0;i<lista.size();i++){
            BeanDareAvere dareAvere = new BeanDareAvere();
            
            BeanFatturaAcquistoDett beanFatturaAcquistoDett=(BeanFatturaAcquistoDett)lista.get(i);
            if(beanFatturaAcquistoDett.getImportoRata() != null){
                if(beanFatturaAcquistoDett.getPagato().equals("N")){
                    
                    String[] splitData = beanFatturaAcquistoDett.getBeanFatturaAcquisto().getData().toString().split("-");
                    String descrizione = "";
                    if(beanFatturaAcquistoDett.getBeanFatturaAcquisto().getBeanFornitore() != null){
                        descrizione += "Fornitore: "+beanFatturaAcquistoDett.getBeanFatturaAcquisto().getBeanFornitore().getRagioneSociale()+" - ";
                    }
                    descrizione += "Fattura numero "+beanFatturaAcquistoDett.getBeanFatturaAcquisto().getNumeroFattura()+
                            " del "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    descrizione += ", Scadenza Rata Numero: "+beanFatturaAcquistoDett.getNumRata()+"/"+beanFatturaAcquistoDett.getBeanFatturaAcquisto().getNumeroRate();
                    splitData = beanFatturaAcquistoDett.getScadenza().toString().split("-");
                    descrizione +=" il "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString()+" ";
                    dareAvere.setDescrizione(descrizione);
                    dareAvere.setImporto(beanFatturaAcquistoDett.getImportoRata());
                    beanDareAvere.setTotaleDare(arrotonda(new Double(beanFatturaAcquistoDett.getImportoRata().doubleValue() + beanDareAvere.getTotaleDare().doubleValue()),2));
                    listaMovDare.add(dareAvere);
                }
            }
        }
        
        BeanDareAvere dare = new BeanDareAvere();
        dare.setDescrizione("Totale dei movimenti in Dare: ");
        dare.setImporto(beanDareAvere.getTotaleDare());
        listaMovDare.add(dare);
        
        beanDareAvere.setMovimentiDare(listaMovDare);
        
        //Movimenti in Avere
        String queryAvere = "select beanFattura from BeanFattura beanFattura" +
                " where beanFattura.data between :dataDa and :dataA" +
                " order by beanFattura.data";
        
        lista=(ArrayList)session.createQuery(queryAvere).setDate("dataDa",dataDa).setDate("dataA",dataA).list();
        
        ArrayList listaMovAvere = new ArrayList();
        
        for(int i=0;i<lista.size();i++){
            BeanFattura beanFattura=(BeanFattura)lista.get(i);
            //RATA 1
            if(beanFattura.getData1()!=null && beanFattura.getImporto1()!=null){
                if(beanFattura.getPagato1().equals("N")){
                    BeanDareAvere dareAvere = new BeanDareAvere();
                    String[] splitData = beanFattura.getData().toString().split("-");
                    String descrizione = "";
                    if(beanFattura.getBeanCliente() != null){
                        descrizione +="Cliente: " +beanFattura.getBeanCliente().getRagioneSociale() +" - ";
                    }
                    descrizione += "Fattura numero "+beanFattura.getCodice()+
                            " del "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    splitData = beanFattura.getData1().toString().split("-");
                    descrizione +=", Scadenza Rata n.1: "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    
                    dareAvere.setDescrizione(descrizione);
                    dareAvere.setImporto(beanFattura.getImporto1());
                    beanDareAvere.setTotaleAvere(arrotonda(new Double(beanFattura.getImporto1().doubleValue() + beanDareAvere.getTotaleAvere().doubleValue()),2));
                    listaMovAvere.add(dareAvere);
                }
            }
            //RATA 2
            if(beanFattura.getData2()!=null && beanFattura.getImporto2()!=null){
                if(beanFattura.getPagato2().equals("N")){
                    BeanDareAvere dareAvere = new BeanDareAvere();
                    String[] splitData = beanFattura.getData().toString().split("-");
                    String descrizione = "";
                    if(beanFattura.getBeanCliente() != null){
                        descrizione +="Cliente: " +beanFattura.getBeanCliente().getRagioneSociale() +" - ";
                    }
                    descrizione += "Fattura numero "+beanFattura.getCodice()+
                            " del "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    splitData = beanFattura.getData2().toString().split("-");
                    descrizione +=", Scadenza Rata n.2: "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    dareAvere.setDescrizione(descrizione);
                    dareAvere.setImporto(beanFattura.getImporto2());
                    beanDareAvere.setTotaleAvere(arrotonda(new Double(beanFattura.getImporto2().doubleValue() + beanDareAvere.getTotaleAvere().doubleValue()),2));
                    listaMovAvere.add(dareAvere);
                }
            }
            //RATA 3
            if(beanFattura.getData3()!=null && beanFattura.getImporto3()!=null){
                if(beanFattura.getPagato3().equals("N")){
                    BeanDareAvere dareAvere = new BeanDareAvere();
                    String[] splitData = beanFattura.getData().toString().split("-");
                    String descrizione = "";
                    if(beanFattura.getBeanCliente() != null){
                        descrizione +="Cliente: " +beanFattura.getBeanCliente().getRagioneSociale() +" - ";
                    }
                    descrizione += "Fattura numero "+beanFattura.getCodice()+
                            " del "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    splitData = beanFattura.getData3().toString().split("-");
                    descrizione +=", Scadenza Rata n.3: "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    dareAvere.setDescrizione(descrizione);
                    dareAvere.setImporto(beanFattura.getImporto3());
                    beanDareAvere.setTotaleAvere(arrotonda(new Double(beanFattura.getImporto3().doubleValue() + beanDareAvere.getTotaleAvere().doubleValue()),2));
                    listaMovAvere.add(dareAvere);
                }
            }
            //RATA 4
            if(beanFattura.getData4()!=null && beanFattura.getImporto4()!=null){
                if(beanFattura.getPagato4().equals("N")){
                    BeanDareAvere dareAvere = new BeanDareAvere();
                    String[] splitData = beanFattura.getData().toString().split("-");
                    String descrizione = "";
                    if(beanFattura.getBeanCliente() != null){
                        descrizione +="Cliente: " +beanFattura.getBeanCliente().getRagioneSociale() +" - ";
                    }
                    descrizione += "Fattura numero "+beanFattura.getCodice()+
                            " del "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    splitData = beanFattura.getData4().toString().split("-");
                    descrizione +=", Scadenza Rata n.4: "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    dareAvere.setDescrizione(descrizione);
                    dareAvere.setImporto(beanFattura.getImporto4());
                    beanDareAvere.setTotaleAvere(arrotonda(new Double(beanFattura.getImporto4().doubleValue() + beanDareAvere.getTotaleAvere().doubleValue()),2));
                    listaMovAvere.add(dareAvere);
                }
            }
        }
        
        BeanDareAvere avere = new BeanDareAvere();
        avere.setDescrizione("Totale dei movimenti in Avere: ");
        avere.setImporto(beanDareAvere.getTotaleAvere());
        listaMovAvere.add(avere);
        
        beanDareAvere.setMovimentiAvere(listaMovAvere);
    }
    
    public void pulisci(){
        HttpSession sessione = (HttpSession)Utilita.getSession();
        HttpServletRequest richiesta =(HttpServletRequest)Utilita.getRequest();
        
        sessione.removeAttribute("form");
        sessione.removeAttribute("posizioneOggetto");
        sessione.removeAttribute("beanFind");
    }
    public Double arrotonda(Object obj,int precisione){
        Double valore=(Double)obj;
        Double valoreArr=new Double(0);
        double pot = Math.pow(10, precisione);
        double  v = valore.doubleValue() * pot;
        valoreArr = new Double(Math.round(v) / pot);
        return valoreArr;
    }
    
}
